package org.malred.hotelsystem.activities;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Looper;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import org.malred.hotelsystem.R;
import org.malred.hotelsystem.dao.HotelDao;
import org.malred.hotelsystem.utils.DBUtil;

import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.function.Function;

public abstract class BaseActivity extends AppCompatActivity {
    // 上下文
    public Context mContext;
    public Bundle intentExtras;
    private SQLiteDatabase r_db;
    private SQLiteDatabase w_db;
    private SimpleDateFormat sdf;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        intentExtras = getIntent().getExtras();
        r_db = new DBUtil(this).getReadableDatabase();
        w_db = new DBUtil(this).getWritableDatabase();
        sdf = new SimpleDateFormat("yyyy-MM-dd");
        setContentView(initLayout());
        initView();
        initData();
    }

    // 定义抽象初始化方法, 创建时调用, 由子类实现
    // 获取xml
    protected abstract int initLayout();

    // 获取view
    protected abstract void initView();

    // 绑定事件/数据准备等操作
    protected abstract void initData();

    /**
     * 显示吐司提示
     *
     * @param msg
     */
    public void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    /**
     * 显示吐司提示,异步,在主线程可以使用
     *
     * @param msg
     */
    public void showToastSync(String msg) {
        // 是android为线程间异步消息通信提供的一种机制
        // 可以方便我们实现多线程编程时线程间的相互沟通
        // Looper的实现是利用消息队列的方式，为用户封装了一层API，用户不需要考虑互斥加锁的问题，方便用户的使用。
        // 消息队列
        if (Looper.myLooper() == null) {
            // 一个线程只能创建一个looper, 这里判断是为了防止多次创建报错
            Looper.prepare();
        }
        // 子线程
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        Looper.loop();
    }

    /**
     * 跳转页面
     *
     * @param cls 目标activity
     */
    public void navigateTo(Class cls) {
        Intent in = new Intent(mContext, cls);
        startActivity(in);
    }

    /**
     * 跳转页面, 携带参数
     *
     * @param cls
     */
    public void navigateTo(Class cls, Map<String, String> args) {
        Intent in = new Intent(mContext, cls);
        for (String key : args.keySet()) {
            in.putExtra(key, args.get(key));
        }
        startActivity(in);
    }

    protected void saveStringToSp(String key, String val) {
        SharedPreferences sp = getSharedPreferences("sp_me", MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString(key, val);
//        editor.commit();
        editor.apply();
    }

    public SQLiteDatabase getDb() {
        return r_db;
    }

    public SQLiteDatabase getWritableDb() {
        return w_db;
    }

    /**
     * 弹出提示框
     *
     * @param title
     * @param msg
     * @param onConfirm
     * @param onCancel
     */
    public void alertClick(String title, String msg,
                           DialogInterface.OnClickListener onConfirm,
                           DialogInterface.OnClickListener onCancel) {
        //创建 一个提示对话框的构造者对象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(title);//设置弹出对话框的标题
        builder.setIcon(R.drawable.lvdian_64);//设置弹出对话框的图标
        builder.setMessage(msg);//设置弹出对话框的内容
        builder.setCancelable(true);//能否被取消
        //正面的按钮（肯定）
        builder.setPositiveButton("确认", onConfirm);
        //反面的按钮（否定）
        builder.setNegativeButton("取消", onCancel);
        builder.show();
    }

    /**
     * 弹出提示框
     *
     * @param title
     * @param msg
     * @param confirmStr
     * @param cancelStr
     * @param onConfirm
     * @param onCancel
     */
    public void alertClick(String title, String msg, String confirmStr, String cancelStr,
                           DialogInterface.OnClickListener onConfirm,
                           DialogInterface.OnClickListener onCancel) {
        //创建 一个提示对话框的构造者对象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(title);//设置弹出对话框的标题
        builder.setIcon(R.drawable.lvdian_64);//设置弹出对话框的图标
        builder.setMessage(msg);//设置弹出对话框的内容
        builder.setCancelable(true);//能否被取消
        //正面的按钮（肯定）
        builder.setPositiveButton(confirmStr, onConfirm);
        //反面的按钮（否定）
        builder.setNegativeButton(cancelStr, onCancel);
        builder.show();
    }

    /**
     * 获得日期格式化工具
     *
     * @return
     */
    public SimpleDateFormat getSdf() {
        return sdf;
    }
}
